// internal/repositories/test_repository.go
package repositories

import (
	"mygin/internal/models"

	"gorm.io/gorm"
)

type TestRepository struct {
	db *gorm.DB
}

func NewTestRepository(db *gorm.DB) *TestRepository {
	return &TestRepository{db: db}
}

// 所有CRUD方法
func (r *TestRepository) Create(test *models.Test) error {
	return r.db.Create(test).Error
}

func (r *TestRepository) GetByID(id uint) (*models.Test, error) {
	var test models.Test
	err := r.db.First(&test, id).Error
	return &test, err
}

// TestFilter 筛选条件
type TestFilter struct {
	Name string
	Age  string
}

// ListWithPagination 获取列表（带分页）
func (r *TestRepository) ListWithPagination(page, pageSize int, filter TestFilter) ([]models.Test, int64, error) {
	var tests []models.Test
	var total int64

	query := r.db.Model(&models.Test{})

	// 应用筛选条件
	if filter.Name != "" {
		query = query.Where("name LIKE ?", "%"+filter.Name+"%")
	}
	if filter.Age != "" {
		query = query.Where("email LIKE ?", "%"+filter.Age+"%")
	}

	// 计算总数
	if err := query.Count(&total).Error; err != nil {
		return nil, 0, err
	}

	// 分页查询
	offset := (page - 1) * pageSize
	if err := query.Offset(offset).Limit(pageSize).Find(&tests).Error; err != nil {
		return nil, 0, err
	}

	return tests, total, nil
}

// 更新
func (r *TestRepository) Update(test *models.Test) error {
	// 使用Select指定只更新非零值字段
	return r.db.Model(test).
		Select("*").
		Where("id = ?", test.ID).
		Updates(test).Error
}

func (r *TestRepository) UpdatePartial(id uint, data map[string]interface{}) error {
	return r.db.Model(&models.Test{}).Where("id = ?", id).Updates(data).Error
}

// 软删除
func (r *TestRepository) DeleteByID(id uint) error {
	// 使用Delete实现软删除（需要模型中有gorm.DeletedAt字段）
	return r.db.Delete(&models.Test{}, id).Error
}

// 硬删除
func (r *TestRepository) HardDeleteByID(id uint) error {
	// 使用Unscoped().Delete实现硬删除
	return r.db.Unscoped().Delete(&models.Test{}, id).Error
}

// 其他方法：Update/Delete/GetAll等...

/****************非curd方法区**************************/
func (r *TestRepository) FindByTestname(testname string) (*models.Test, error) {
	var test models.Test
	if err := r.db.Where("testname = ?", testname).First(&test).Error; err != nil {
		return nil, err
	}
	return &test, nil
}
